package com.niit.springbootshop.controller;

import com.niit.springbootshop.entity.*;
import com.niit.springbootshop.service.OrderService;
import com.niit.springbootshop.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;
import java.util.*;

/**
 * @program: springboot-demo
 * @description:
 * @author: hanliang
 * @create: 2021-05-12 23:30
 **/
@Controller
public class OrderController {

    @Autowired
    ProductService productService;

    @Autowired
    OrderService orderService;

    /**
     * 添加购物车实现
     *
     * @param pid      商品id,用于查询商品信息
     * @param quantity 需要添加的商品的数量
     * @param session  会话，可以保存购物车信息
     * @return
     */
    @RequestMapping("addCart")
    @ResponseBody // 返回的数据，作为response的部分 , ajax请求 返回时候还是回到原页面
    public Map<String,Object> addCart(int pid, int quantity, HttpSession session){
        Map<String,Object> resultMap = new HashMap<>();
        try {
            // 1. 先判断Session中有没有购物车
            Cart cart = (Cart) session.getAttribute("CART");
            if (cart == null) {// session里面没有购物车，第一次添加商品
                cart = new Cart(); // 创建新的购物车
            }
            // 2.往购物车类中添加数据
            CartItem item = new CartItem();
            // 根据hidden的商品id 查询商品的详细信息
            Product product = productService.selectByPrimaryKey(pid);
            item.setProduct(product); // 商品信息
            item.setQuantity(quantity); // 来自于界面上的输入的数量

            // 将数据添加到购物车 类
            cart.add(item);
            // 一定将购物车信息，保存到session中
            session.setAttribute("CART", cart);
        } catch(Exception e) {
            resultMap.put("CODE", "E101");
        }
        // CODE 会成为json的  变量名/key值
        // C100 会成为 json的  value
        resultMap.put("CODE", "C100");
        return resultMap;
    }

    @RequestMapping("/goCart")
    public String goCart() {
        return "cart";
    }

    @RequestMapping("/deleteCart")
    public String deleteCart(int pid,HttpSession session) {
        // 先取出来 删除之前的购物车
        Cart cart = (Cart)session.getAttribute("CART");
        cart.delete(pid); // 删除商品
        // 将删除之后的购物车再存回session
        session.setAttribute("CART", cart);
        return "cart";
    }

    @RequestMapping("/clearCart")
    public String clearCart(HttpSession session) {
        // 先取出来 删除之前的购物车
        Cart cart = (Cart)session.getAttribute("CART");
        cart.clear();
        // 将删除之后的购物车再存回session
        session.setAttribute("CART", cart);
        return "cart";
    }

    /**
     * @param ids     一个数组，接收界面上 所有name属性为 ids的checkbox的值
     * @param session 会话，从session中获取购物车的信息
     * @param map     返回值的集合，将需要返回的数据，存入map中
     * @return
     */
    @RequestMapping("/submitOrder")
    public String submitOrder(@RequestParam("ids") Integer[] ids,
                              HttpSession session,
                              Map<String,Object> map) {
        // 判断用户是否登录
        User user = (User)session.getAttribute("USER");
        if(user==null) { // 如果没有登录
            return "redirect:/toLogin"; // 跳转到登录界面
        }
        // ------变量定义开始------
        // ① 保存从购物车列表中根据ids数组筛选出来的商品列表，最终会显示在订单界面上
        List<CartItem> orderList = new ArrayList<>();
        // ② 总金额
        double total =0; // 选择的商品的总价
        // ------变量定义结束------

        // 1. 从Session中获取CART,也就是购物车的信息
        Cart cart = (Cart)session.getAttribute("CART");

        // 2. 从购物车中，获取购物车所有商品的集合  CartMap
        Map<Integer,CartItem> cartMap = cart.getCartMap();

        // 3. 根据ids数组存放的id,从CartMap中筛选勾选的商品的信息
        for(int id : ids) {
            if(cartMap.containsKey(id)) { //如果id在 map中存在
                // 从购物车商品列表中，获取id对应的商品
                CartItem ci = cartMap.get(id);
                // 保存到 订单商品信息列表中,以便在订单界面显示商品信息
                orderList.add(ci);
                // 计算下 订单的总金额(将找到的商品的小计金额，添加到总金额中)
                total +=ci.getSubTotal();
            }
        }

        // 4. 把订单的数据存入Orders表
        Orders orders = new Orders();
        orders.setTotal(total);       // 计算之后的总金额
        orders.setState(1);           // 订单状态为1
        orders.setUid(user.getUid()); // 买家的id
        orders.setOrdertime(new Date());
        orderService.insertOrders(orders);

        int oid = orders.getOid();// 获取出来 添加订单信息之后返回的 oid
        // 5. 遍历/循环 上面代码 筛选之后的商品列表
        for(CartItem ci : orderList) {
            Orderitem oi = new Orderitem();
            oi.setCount(ci.getQuantity());       // 购买的数量
            oi.setSubtotal(ci.getSubTotal());    // 小计金额
            oi.setPid(ci.getProduct().getPid()); // 商品id
            oi.setOid(oid);                      // 上面 获取出来的订单编号
            orderService.insertOrderItem(oi);
        }

        // 6. 返回数据到界面
        // ① 已经筛选好的商品的列表
        map.put("orderList", orderList);
        // ② 总的金额
        map.put("total", total);
        // ③ 订单编号
        map.put("oid", oid);
        map.put("user", user);
        return "order";
    }
}
